package com.zhang.common.jpa.service;

import com.zhang.common.jpa.entity.*;
import org.springframework.data.domain.Page;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Supplier;

public interface BaseService<T extends BaseEntity,ID>{


    <R extends DTO> Page<R> page(T queryEntity, Map<String,String[]> queryMap);

    <R extends DTO> Page<R> page(Supplier<T> supplier,PageCmd pageCmd,Map<String,String[]> queryMap);



    /**
     * 添加对象
     * @param entity
     * @return
     */
    T save(T entity);

    T save(AddCmd addCmd,Supplier<T> Constructor);



    /**
     * 添加全部对象
     * @param entities
     * @return
     */
    List<T> saveAll(List<T> entities);

    /**
     * 更新
     * @param entity
     * @return
     */
    boolean update(T entity);

    /**
     * 更新
     * @param editCmd
     * @return
     */
    boolean update(EditCmd editCmd);



    /**
     * 更新全部
     * @param entities
     * @return
     */
    boolean updateAll(List<T> entities);

    /**
     * 根据id获取 物理
     * @param id
     * @return
     */
    T get(ID id);

    /**
     * 根据ids获取 物理
     * @param ids
     * @return
     */
    List<T> getByIds(Set<ID> ids);




    /**
     * 获取全部 物理
     * @return
     */
    List<T> getAll();


    /**
     * 根据id获取 逻辑
     * @param id
     * @return
     */
    T getLogic(ID id);

    /**
     * 根据ids获取 逻辑
     * @param ids
     * @return
     */
    Set<T> getByIdsLogic(Set<ID> ids);

    Set<T> getByIdsLogic(String ids);


    /**
     * 获取全部 逻辑
     * @return
     */
    List<T> getAllLogic();

    /**
     * 物理删除
     * @param id
     * @return
     */
    boolean delete(ID id);

    /**
     * 物理删除全部
     * @param ids
     * @return
     */
    boolean deleteAll(Set<ID> ids);

    /**
     * 逻辑删除
     * @param id
     * @return
     */
    boolean deleteLogic(ID id);

    /**
     * 逻辑删除全部
     * @param ids
     * @return
     */
    boolean deleteAllLogic(Set<ID> ids);
}
